今更ながらBigQueryのオブジェクトテーブルを触ってみた
Google Cloudデータエンジニアのはんざわです。
先日、BigQueryのオブジェクトテーブルを利用する機会があり、その際に得た知見を本ブログにまとめたいと思います。
オブジェクトテーブルとは?
オブジェクトテーブルとは、BigQueryの外部テーブルの一種でCloud Storageにある非構造化データの読み取りが可能なテーブルです。
主なユースケースとして、BigQuery MLやCloud Vision、Document AIなどを使用した非構造化データの推論が挙げられます。
事前準備
上記ドキュメントを参考にオブジェクトテーブルを作成します。
事前準備では、以下の4つを実施しております。
- Cloud Storageの作成
- オブジェクトテーブルが参照する非構造化データのアップロード
- BigQuery Connectionの作成
- BigQuery Connectionのサービスアカウントの権限設定
1. Cloud Storageの作成と非構造化データのアップロード
まずは、オブジェクトテーブルが参照するCloud Storageと非構造化データの準備をします。
コネクションと同じようにGoogle Cloud Shellで次のコマンドを実行し、Cloud Storageを作成します。
gcloud storage buckets create gs://object-tables-test \
--location=asia-northeast1 \
--uniform-bucket-level-access
さらに次のコマンドをローカルで実行し、テスト用の画像データをCloud Storageにアップロードします。
gcloud storage cp fruit_ringo.png gs://object-tables-test/png/
gcloud storage cp soccer_ball.png gs://object-tables-test/png/
2. BigQuery Connectionの準備
まずは、Cloud Storageに接続するために BigQuery Connection を作成します。
ここで作成するクラウドリソース接続は、BigLakeテーブルやリモート関数で使用されるものと同じです。
Google Cloud Shellで以下のコマンドを実行し、BigQuery Connectionを作成します。
コネクション名を object-tables-connection
とし、ロケーションはCloud Storageと同じ asia-northeast1(東京リージョン)
にしました。
bq mk --connection \
--location=asia-northeast1 \
--connection_type=CLOUD_RESOURCE \
object-tables-connection
さらに作成したBigQuery ConnectionのサービスアカウントがCloud Storageのオブジェクトを参照できるように権限を割り当てます。
今回の例だと、bqcx-868908576898-oc3s@gcp-sa-bigquery-condel.iam.gserviceaccount.com
のサービスアカウントにバケット単位で objectViewer
の権限を割り当てます。
Google Cloud Shellで次のコマンドを実行し、前述したサービスアカウントがgs://object-tables-test
のオブジェクトを参照する権限を割り当てます。
gsutil iam ch serviceAccount:bqcx-868908576898-oc3s@gcp-sa-bigquery-condel.iam.gserviceaccount.com:objectViewer gs://object-tables-test
オブジェクトテーブルを試してみる
事前準備が終わったので早速、オブジェクトテーブルを作成します。
オブジェクトテーブルの作成は、BigQueryから以下のSQLを発行して作成します。
CREATE EXTERNAL TABLE object_tables.test1
WITH CONNECTION `asia-northeast1.object-tables-connection`
OPTIONS(
object_metadata = 'SIMPLE',
uris = ['gs://object-tables-test/png/*']
);
作成されたテーブルを確認すると次のようなスキーマ構成になっていました。
各フィールドの詳細は以下のドキュメントの通りです。
続いて、以下のクエリでテーブルの中身を確認してみます。
SELECT
*
FROM
object_tables.test1
ドキュメントに記載通りの情報を取得することができました。
おまけ
オブジェクトテーブルには、ファイルのコンテンツをRAWバイトで表す data
という擬似列が存在します。
次の例のようにBase64でエンコードされた文字列を取得することが可能です。
SELECT
data,
uri
FROM
object_tables.test2
デコードすることでファイルの中身を確認することも可能です。
SELECT
CAST(data AS STRING),
uri
FROM
object_tables.test2
そのままJson型にパーズすることも可能です。
SELECT
PARSE_JSON(CAST(data AS STRING)) AS json_data,
uri
FROM
object_tables.test2
一応、ドキュメントには以下のような記載がありますので利用する際は注意してください。
また、オブジェクト テーブルには、ファイル コンテンツを RAW バイトで表す data 疑似列も含まれます。これは、オブジェクト テーブルの作成時に自動的に入力されます。この疑似列は、画像データの推論時に ML.DECODE_IMAGE 関数で使用されます。data 疑似列はクエリに含めることはできず、オブジェクト テーブル スキーマの一部としては表示されません。
まとめ
今回のブログでは、BigQueryのオブジェクトテーブルを紹介しました。
BigQueryで画像や音声の機械学習タスクを扱う場合は有用な機能だと思います。
そのような機会があった方は、是非利用を検討してみてください。